//多态 => 编译多态 运行多态
//编译多态=>指为不同数据类型的实体提供统一的接口(把相关的数据整合起来通过同一个接口去调用)
//运行多态=>重载和重写

//继承是多态(编译多态)使用的前提
//在定义很多通用的接口时,通常会让调用者传入父类, 通过多态来实现更加灵活的调用方式
//但是,父类本身其实并不需要对某些方法进行具体的实现,所以父类中定义的方法,可以定义为抽象方法

//抽象方法=>
//在ts中没有具体实现的方法(抽象方法)
//抽象方法, 必须存在于抽象类中
//抽象类必须使用 abstract声明

//抽象类=>
//抽象类是不能被实例化的(也就是不能通过new关键字来创建);
//抽象方法必须被子类实现, 否则该类必须是一个抽象类


//抽象类 abstract
abstract class Shape{//形状类
    //抽象方法
    abstract getArea():number
}
class Rectangle extends Shape{//矩形类
    public width: number
    public height: number
    constructor(width: number, height: number) {
        super()
        this.width = width
        this.height = height
    }
    getArea(){
        return this.width * this.height
    }
}
let rectangle = new Rectangle(100,100);
class Circle extends Shape{//圆形类
    public r: number
    constructor(r: number) {
        super()
        this.r = r
    }
    getArea(){
        return this.r * this.r * 3.14
    }
}
let circle = new Circle(100);


function getArea(shape:Shape){//获取面积
    console.log(shape.getArea())
}

getArea(rectangle)// width height
getArea(circle)// R

//抽象类 不能使用new创建 不能被实例化
// let shape = new Shape()
// getArea(shape)//shape => {getArea(){}}


